package com.atguigu.edu.realtime.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.atguigu.edu.realtime.common.EduConfig;

/**
 * @ClassName DruidDSUtil
 * @Description TODO 获取数据库连接池对象
 * @Author AFei
 * @Date 2022/9/3 22:52
 * @Version 1.0
 */
public class DruidDSUtil {
    private static DruidDataSource druidDataSource;
    public static DruidDataSource createDataSource(){
        if (druidDataSource == null) {
            synchronized (DruidDSUtil.class) {
                if (druidDataSource == null) {
                    System.out.println("~~~获取Druid连接池对象~~~");
                    // 创建连接池
                    druidDataSource = new DruidDataSource();
                    // 设置驱动全类名
                    druidDataSource.setDriverClassName(EduConfig.PHOENIX_DRIVER);
                    // 设置连接url
                    druidDataSource.setUrl(EduConfig.PHOENIX_URL);
                    // 设置初始化连接池中连接的数量
                    druidDataSource.setInitialSize(5);
                    // 设置同时活跃的最大连接数
                    druidDataSource.setMaxActive(20);
                    // 设置空闲时的最小连接数 必须介于 0 和最大连接数之间 默认为0
                    druidDataSource.setMinIdle(5);
                    // 设置没有空余连接时的等待时间 超时抛出异常 -1 表示一直等待
                    druidDataSource.setMaxWait(-1);
                    // 验证连接是否可用使用的 SQL 语句
                    druidDataSource.setValidationQuery("select 1");
                    // 指明连接是否被空闲连接回收器（如果有）进行检验 如果检测失败 则连接将从池中去除
                    // TODO 注意 默认为true 如果没有设置 validationQuery  则报错
                    // testWhileIdle is true , validationQuery not set
                    druidDataSource.setTestWhileIdle(true);
                    // 借出连接时 是否测试 设置为false 不测试 否则很影响性能
                    druidDataSource.setTestOnBorrow(false);
                    // 归还连接时 是否测试
                    druidDataSource.setTestOnReturn(false);
                    // 设置空闲连接回收器每隔 30s 运行一次
                    druidDataSource.setTimeBetweenEvictionRunsMillis(30 *1000L);
                    // 设置池中连接空闲 30min 被回收 默认值即为 30min
                    druidDataSource.setMinEvictableIdleTimeMillis(30 * 60 * 1000L);
                }
            }
        }
        return druidDataSource;
    }
}
